/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm;

import fait.ferm.engine.IfaceEngine;
import fait.ferm.engine.ResultEngine;
import fait.ferm.global.Glob;
import fait.ferm.persists.Users;
import fait.ferm.ui.NewUser;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.geometry.Rectangle2D;
import javafx.scene.Group;
import javafx.scene.GroupBuilder;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.GridPaneBuilder;
import javafx.scene.layout.HBoxBuilder;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.text.TextBuilder;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**Класс, реализующий форму регистрации пользователя в системе.
 *
 * @author zx
 */
public class UserRegistration {
	private Stage logStage;
	private TextField userTF;
	private PasswordField passwordPF;
	private Label errorMessage;
	Users loggedUser;
	
	/**Метод регистрации пользователя. Вызывает модальное диалоговое окно для ввода имени пользователя и пароля.
	 *
	 * @param pUserName имя пользвателя по умолчанию. 
	 * @return Зарегистрированного пользователя или null
	 */
	public Users login(String pUserName){
        Rectangle2D formSize = new Rectangle2D(0, 0, 420, 200);
		logStage = new Stage();
		Group rootGroup = null;
		
		
//создаем основное содержимое формы
		GridPane gridPane = GridPaneBuilder.create()
							.alignment(Pos.CENTER)
							.hgap(10)
							.vgap(10)
							.padding(new Insets(25, 25, 25, 25))
							.build();
		gridPane.add( TextBuilder.create()
						.text("Добро пожаловать")
						.build(),
					0,0,2,1	);
		
		userTF = new TextField(pUserName);
		passwordPF = new PasswordField();
		//********* УБРАТЬ ****************************
		userTF.textProperty().set("aa");			//*
		passwordPF.textProperty().set("11");		//*
		//*********************************************
		gridPane.add( new Label("Имя пользователя:"),0,1);
		gridPane.add( new Label("Пароль:"),0,2);
		gridPane.add( userTF,1,1);
		gridPane.add( passwordPF,1,2);
		gridPane.add(HBoxBuilder.create()//три кнопки в гориз. бокс
				.alignment(Pos.CENTER)
				.spacing(10)
				.children(
					ButtonBuilder.create()
						.text("Новый пользователь...")
						.onAction(new EventHandler<ActionEvent>() {
							@Override public void handle(ActionEvent t) {
								NewUser nu = new NewUser(logStage);
								loggedUser = nu.newUserForm();
								if(loggedUser != null) {
									userTF.setText(loggedUser.name);
									passwordPF.setText("");
								}
							}
						})
						.build(),
					ButtonBuilder.create()
						.text("Регистрация")
						.onAction(new EventHandler<ActionEvent>() {
							@Override public void handle(ActionEvent t) {
								loggedUser = registrateUser(userTF.getText().trim(), passwordPF.getText() );
								if(loggedUser != null) {
									logStage.close();
								}
							}
						})
						.build(),
					ButtonBuilder.create()
						.text("Выход")
						.onAction(new EventHandler<ActionEvent>() {
							@Override public void handle(ActionEvent t) {
								Platform.exit();
								logStage.close();
							}
						})
						.build()
				)
				.build(), 
				0, 3, 2,1);
		errorMessage = LabelBuilder.create()
				.alignment(Pos.CENTER)
				.textFill(Color.RED)
				.text("")
				.build();
		gridPane.add(errorMessage, 0,4,2,1);
//создаем сцену
		Scene scene = SceneBuilder.create()
				.width(formSize.getWidth())
				.height(formSize.getHeight())
				.root(
				  rootGroup = GroupBuilder.create()
					.children(
						RectangleBuilder.create()//для красоты
							.x(1)
							.y(1)
							.width(formSize.getWidth()-2)
							.height(formSize.getHeight()-2)
							.arcWidth(5)
							.arcHeight(5)
							.fill(Color.rgb(0xc0, 0xee, 0xff))
							.stroke(Color.DARKBLUE)
							.build(),
						gridPane
					)
					.build()
				)
				.build();
		logStage.setScene(scene);
		userTF.requestFocus();		
        logStage.initModality(Modality.WINDOW_MODAL);
        logStage.initOwner(Glob.primaryStage);
        logStage.initStyle(StageStyle.UNDECORATED);
        logStage.showAndWait();
		
        return loggedUser;
    }
	
	
/**
 * Вызывается при нажатии на кнопку "Регистрация". Вызывает соответствующий метод движка.
 * @param pn имя пользователя
 * @param pp пароль
 * @return Объект зарегистрированного пользователя или null
 */
	private Users registrateUser(String pn, String pp){
		IfaceEngine fe = Glob.getFermEngine(); // получаем ссылку на движок
		ResultEngine res = fe.login(pn, pp);	// движок пытается зарегистрировать пользователя
		if(res.error.isOk() ){					// проверяем результат
			return (Users)res.obj;				// если все хорошо, возвращаем пользователя
		}
		errorMessage.setText(res.error.getMessage()); // иначе, выводим сообщение об ошибке
		return null;	
	}	
}
